home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
c
/
zm16src
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-05-18
|
13KB
|
700 lines
/*
* Main Module
*
* Jwahar Bammi
* usenet: mandrill!bammi@{decvax,sun}.UUCP
* csnet: bammi@mandrill.ces.CWRU.edu
* arpa: bammi@mandrill.ces.CWRU.edu
* CompuServe: 71515,155
*/
#include "config.h"
#include "zmdm.h"
#include "common.h"
#ifndef Vsync /* Atari forgot these in osbind.h */
#define Vsync() xbios(37)
#endif
#define esc 27
#define cr 0x0d
#define mvto(r,c) EscSeq('Y');Bconout(2,r+040);Bconout(2,c+040)
/* Globals belonging to this module only */
int rs232 = 1, /* Ports */
console = 2;
int speed, /* rs232 setup parameters */
#ifdef FLOW_CTRL
flowctl = 1,
#else
flowctl = 0,
#endif
ucr = -1,
rsr = -1,
tsr = -1,
scr = -1;
/*
* setRs232() - set rs232 port configuration
*/
#ifndef REMOTE
void setRs232 ()
{
char ch;
long conin;
Bconws("Baud rate: ");
EscSeq('p');
Bconws("0=19200 1=9600, 2=4800, 3=2400, 4=1200, 5=300\r\n");
EscSeq('q');
Bconout(2, '\t');
EscSeq('p');
Bconws("What speed==>");
EscSeq('q');
conin = Bconin(console); /* get speed */
if ((conin & 0x00FF0000L) == 0x00610000L)
{
his_screen();
ResetIoBuf();
finish();
}
ch = (char) (conin & 0x007f);
Bconout(2, ' ');
switch (ch)
{
case '0': /* 19200 */
speed = 0;
Bconws("19200");
Baudrate = 19200;
break;
case '1':
speed = 1; /* 9600 */
Bconws("9600");
Baudrate = 9600;
break;
case '2':
speed = 2; /* 4800 */
Bconws("4800");
Baudrate = 4800;
break;
case '3':
speed = 4; /* 2400 */
Bconws("2400");
Baudrate = 2400;
break;
case '4':
speed = 7; /* 1200 */
Bconws("1200");
Baudrate = 1200;
break;
case '5':
speed = 9; /* 300 */
Bconws("300");
Baudrate = 300;
break;
default:
speed = getbaud();
Bconws(BAUD_STRING(speed));
Baudrate = BAUD_RATE(speed);
}
Bconws(" Baud\r\n");
/* Set new Baud rate */
/* Txoff(); */
Rsconf(speed, flowctl, ucr, rsr, tsr, scr);
Vsync(); Vsync();
/* Txon(); */
}
#else
void setRs232 ()
{
char ch;
long conin;
Bauxws("Baud rate: ");
Bauxws("0=19200 1=9600, 2=4800, 3=2400, 4=1200, 5=300\r\n");
Bconout(1, '\t');
Bauxws("What speed==>");
conin = Bconin(1); /* get speed */
if (((int)(conin & 0x007f) & CTRL('U')) == CTRL('U'))
{
his_screen();
ResetIoBuf();
finish();
}
ch = (char) (conin & 0x007f);
Bconout(1, ' ');
switch (ch)
{
case '0': /* 19200 */
speed = 0;
Bauxws("19200");
Baudrate = 19200;
break;
case '1':
speed = 1; /* 9600 */
Bauxws("9600");
Baudrate = 9600;
break;
case '2':
speed = 2; /* 4800 */
Bauxws("4800");
Baudrate = 4800;
break;
case '3':
speed = 4; /* 2400 */
Bauxws("2400");
Baudrate = 2400;
break;
case '4':
speed = 7; /* 1200 */
Bauxws("1200");
Baudrate = 1200;
break;
case '5':
speed = 9; /* 300 */
Bauxws("300");
Baudrate = 300;
break;
default:
speed = getbaud();
Bauxws(BAUD_STRING(speed));
Baudrate = BAUD_RATE(speed);
}
Bauxws(" Baud\r\n");
/* Set new Baud rate */
/* Txoff(); */
Rsconf(speed, flowctl, ucr, rsr, tsr, scr);
Vsync(); Vsync();
/* Txon(); */
}
#endif /* REMOTE */
/*
* help() - display help info and menu
*/
#ifndef REMOTE
void help ()
{
register long conin;
register int x;
extern char *r_filename();
my_screen(); /* Switch to my screen memory */
EscSeq('v'); /* wrap at end of line */
EscSeq('E'); /* clear screen */
mvto(2,25);
EscSeq('p');
Bconws("ZMDM Version ");
Bconws(ZMDMVERSION);
EscSeq('q');
EscSeq('p');
x = strlen(COMPILER);
x = (80 - x)/2;
mvto(3,x);
Bconws(COMPILER);
EscSeq('q');
mvto(5,25);
Bconws("ST Enthusiasts @ ces.CWRU.edu\r\n\n");
/* Put up menu */
Bconws("\r\n\t");
EscSeq('p'); /* reverse video */
Bconws("Undo");
EscSeq('q'); /* quit reverse video */
Bconws(" to exit.\r\n");
Bconws("\t");
EscSeq('p'); /* reverse video */
Bconws("Help");
EscSeq('q'); /* quit reverse video */
Bconws(" for this message.\r\n");
Bconws("\t");
EscSeq('p'); /* reverse video */
Bconws("Escape");
EscSeq('q'); /* quit reverse video */
Bconws(" to send a break.\r\n");
Bconws("\t");
EscSeq('p'); /* reverse video */
Bconws("T or t");
EscSeq('q'); /* quit reverse video */
Bconws(" to do file transfers and local functions.\r\n");
#ifdef PHONES
Bconws("\t");
EscSeq('p'); /* reverse video */
Bconws("P or p");
EscSeq('q'); /* quit reverse video */
Bconws(" for Phone services.\r\n");
#endif
if(rez == 2)
{
Bconws("\t");
EscSeq('p'); /* reverse video */
Bconws("H or h");
EscSeq('q'); /* quit reverse video */
Bconws(" for Hi Rez Toggle (25/50 Lines).\r\n");
}
Bconws("\t");
EscSeq('p'); /* reverse video */
Bconws("I or i");
EscSeq('q'); /* quit reverse video */
Bconws(" to Invert screen colors.\r\n");
Bconws("\t");
EscSeq('p'); /* reverse video */
Bconws("Return");
EscSeq('q'); /* quit reverse video */
Bconws(" to do nothing.\r\n");
Bconws("\t");
EscSeq('p'); /* reverse video */
Bconws("B or b");
EscSeq('q'); /* quit reverse video */
Bconws(" to set baud rate. Currently is ");
EscSeq('p');
Bconws(BAUD_STRING(speed));
Bconws(" Baud.\r\n\r\n");
EscSeq('q');
/* get response */
conin = Bconin(console);
if ((conin & 0x00FF0000L) == 0x00610000L)
{
/* He hit <UNDO> */
his_screen();
ResetIoBuf();
finish();
}
switch((int)(conin & 0x007f))
{
case 'B':
case 'b':
/* Set baud rate */
setRs232();
break;
case 'T':
case 't':
EscSeq('E'); /* clear screen */
/* Set no flow Control */
#ifdef FLOW_CTRL
Rsconf(-1,0,-1,-1,-1,-1);
Vsync(); Vsync();
#endif
/* Go do transfers */
transfer();
#ifdef FLOW_CTRL
/* Flow Control On */
/* Txoff(); */
Rsconf(-1,1,-1,-1,-1,-1);
Vsync(); Vsync();
/* Txon(); */
#endif
his_screen();
return;
case '\033':
/* Send a break */
sendbrk();
his_screen(); /* Don't wait for the key hit */
return;
case 'i':
case 'I':
/* Invert screen colors */
his_screen();
if(scolor == 0)
{
EscSeq('b'); /* Foreground color 0 */
Bconout(2, 0);
EscSeq('c'); /* Background color 1 */
Bconout(2, 1);
scolor = 1;
}
else
{
EscSeq('b'); /* Foreground color 1 */
Bconout(2, 1);
EscSeq('c'); /* Background color 0 */
Bconout(2, 0);
scolor = 0;
}
EscSeq('E'); /* Clear the screen */
return;
#ifdef PHONES
case 'p':
case 'P':
/* Phone Services */
phone();
return;
#endif
case 'h':
case 'H':
/* Hi rez 25/50 toggle */
if(rez == 2)
{
if(hlines == 25)
{
hlines = 50;
hi50();
}
else
{
hlines = 25;
hi25();
}
his_screen();
EscSeq('E'); /* clear screen */
return;
}
/* else fall Through */
default:
Bconws("No Change\r\n");
}
/* Wait for a key hit */
hit_key();
/* back to terminal screen */
his_screen();
}
#else
void help ()
{
register long conin;
extern char *r_filename();
my_screen(); /* Switch to my screen memory */
Bauxws("\r\n\n");
Bauxws(" RZMDM Version ");
Bauxws(ZMDMVERSION);
Bauxws("\r\n ");
Bauxws(COMPILER);
Bauxws("\r\n\n ST Enthusiasts @ ces.CWRU.edu\r\n\n");
/* Put up menu */
Bauxws("\r\n\t");
Bauxws("CTRL-U");
Bauxws(" to exit.\r\n");
Bauxws("\t");
Bauxws("CTRL-Z");
Bauxws(" for this message.\r\n");
Bauxws("\t");
Bauxws("Escape");
Bauxws(" to send a break.\r\n");
Bauxws("\t");
Bauxws("T or t");
Bauxws(" to do file transfers and local functions.\r\n");
Bauxws("\t");
Bauxws("Return");
Bauxws(" to do nothing.\r\n");
Bauxws("\t");
Bauxws("B or b");
Bauxws(" to set baud rate. Curently is ");
Bauxws(BAUD_STRING(speed));
Bauxws(" Baud.\r\n\r\n");
/* get response */
conin = Bconin(1);
if (((int)(conin & 0x007f) & CTRL('U')) == CTRL('U'))
{
/* He hit <UNDO> */
his_screen();
ResetIoBuf();
finish();
}
switch((int)(conin & 0x007f))
{
case 'B':
case 'b':
/* Set baud rate */
setRs232();
break;
case 'T':
case 't':
Bauxws("\r\n\n"); /* clear screen */
/* Set no flow Control */
#ifdef FLOW_CTRL
Rsconf(-1,0,-1,-1,-1,-1);
Vsync(); Vsync();
#endif
/* Go do transfers */
transfer();
#ifdef FLOW_CTRL
/* Flow Control On */
/* Txoff(); */
Rsconf(-1,1,-1,-1,-1,-1);
Vsync(); Vsync();
/* Txon(); */
#endif
his_screen();
return;
case '\033':
/* Send a break */
sendbrk();
his_screen(); /* Don't wait for the key hit */
return;
/* else fall Through */
default:
Bauxws("No Change\r\n");
}
/* back to terminal screen */
his_screen();
}
#endif /* REMOTE */
main ()
{
register int c; /* rs232 input */
register int i;
register long conin;
#ifndef REMOTE
extern int *aaddress(); /* Routine that returns base address of
* line A variables
*/
#else
extern FILE *fopen();
#endif
#if (MWC || MANX)
extern char *lmalloc();
#endif
/* Set up Dta */
Fsetdta(&statbuf);
/* Get screen rez */
rez = Getrez();
drv_map = Drvmap();
#if (MWC || MANX)
#ifndef REMOTE
if((m_screen = (long *)lmalloc(
(unsigned long)((8L*1024L+32L)*(long)sizeof(long))))
== (long *)NULL)
{
Bconws("Sorry, could not allocate enough memory\r\n");
Pterm(3);
}
#endif /* REMOTE */
#ifndef DYNABUF
if((bufr = (unsigned char *)lmalloc((unsigned long)BBUFSIZ))
== (unsigned char *)NULL)
#else
if((bufr = dalloc()) == (unsigned char *)NULL)
#endif /* DYNABUF */
{
#ifdef REMOTE
Bauxws("Sorry, could not allocate enough memory\r\n");
#else
Bconws("Sorry, could not allocate enough memory\r\n");
#endif
Pterm(4);
}
#else /* MWC || MANX */
#ifdef DYNABUF
if((bufr = dalloc()) == (unsigned char *)NULL)
{
#ifdef REMOTE
Bauxws("Sorry, could not allocate enough memory\r\n");
#else
Bconws("Sorry, could not allocate enough memory\r\n");
#endif
Pterm(5);
}
#endif /* DYNABUF */
#endif /* MWC || MANX */
#ifndef REMOTE
#if (MWC || MANX)
ms_ptr = (long *) ((0xffffff00L & ((long)(m_screen))) + 0x00000100L);
#else
ms_ptr = (long *) ((0xffffff00L & ((long)(&m_screen[0]))) + 0x00000100L);
#endif /* MWC */
EscSeq('e'); /* Turn on the cursor */
EscSeq('v'); /* wrap at end of line */
EscSeq('E'); /* clear screen */
#endif /* REMOTE */
SetIoBuf();
speed = getbaud();
/* Txoff(); */
Rsconf((int) speed, flowctl, ucr, rsr, tsr, scr); /* init set */
Vsync(); Vsync();
/* Txon(); */
Baudrate = BAUD_RATE(speed);
#ifndef REMOTE
aline_addr = aaddress();
STDERR = stderr;
#else
#ifndef DLIBS
if((STDERR = fopen("aux:", "rw")) == (FILE *)NULL)
{
Bauxws("Could not Open Aux Stream for Stderr\r\n");
finish();
}
setbuf(STDERR, (char *)NULL);
#else
STDERR = stdaux;
#endif /* DLIBS */
#endif /* remote */
help();
i = 0;
while (0 == 0) /* infinite loop */
{
#ifndef REMOTE
while (Bconstat(rs232) != 0)
{
/* Char at Modem */
c = Bconin(rs232) & 0x007f;
Bconout(console, c);
/* Check the console once in a while */
/* important at High speeds */
if ((++i) & 32)
{
if (Bconstat(console) != 0)
{
conin = Bconin(console);
Bconout(rs232, (int) (conin & 0x007f));
}
i = 0;
}
}
if (Bconstat(console) != 0)
{
/* Char at Console */
conin = Bconin(console);
if ((conin & 0x00FF0000L) == 0x00610000L) /* Undo */
{
ResetIoBuf();
finish();
}
if ((conin & 0x00FF0000L) == 0x00620000L) /* Help */
help();
else
Bconout(rs232, (int) (conin & 0x007f));
}
#else
while (Bconstat(rs232) != 0)
{
/* Char at Modem */
c = Bconin(rs232) & 0x007f;
if ((c & CTRL('U')) == CTRL('U')) /* Undo */
{
ResetIoBuf();
finish();
}
if ((c & CTRL('Z')) == CTRL('Z')) /* Help */
help();
else
Bconout(rs232,c);
}
#endif /* REMOTE */
}
}
finish()
{
#ifdef PHONES
/* Save phone directory if it changed */
extern int dchanged;
if(dchanged)
{
if(writedir() == 1)
hit_key();
}
#endif
#if (MWC || MANX)
#ifdef DYNABUF
Mfree(bufr);
#else
free(bufr);
#endif
#ifndef REMOTE
free(m_screen);
#endif
#else
#ifdef DYNABUF
Mfree(bufr);
#endif
#endif
exit(0);
}
/* -eof- */